home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Programming Languages Suite
/
ProgramD2.iso
/
Borland
/
Borland C++ V5.02
/
GDIDIB.PAK
/
MISC.C
< prev
next >
Wrap
C/C++ Source or Header
|
1997-05-06
|
7KB
|
273 lines
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (C) 1993 - 1995 Microsoft Corporation. All Rights Reserved.
//
// MODULE: misc.c
//
// PURPOSE: Contains all helper functions "global" to the application.
//
// FUNCTIONS:
// CenterWindow - Center one window over another.
// SetWindowTitle - Sets the title of the application window.
// InitDIBSection - Initializes the bitmap surface of the current DIB
// section and paints the display.
// RemoveDIBSection - Removes the current DIB section.
//
// COMMENTS:
//
//
#include <windows.h> // required for all Windows applications
#include <commctrl.h> // prototypes and structure for the common controls.
#include "globals.h" // prototypes specific to this application
#include "resource.h"
#include "toolbar.h"
//
// FUNCTION: CenterWindow(HWND, HWND)
//
// PURPOSE: Center one window over another.
//
// PARAMETERS:
// hwndChild - The handle of the window to be centered.
// hwndParent- The handle of the window to center on.
//
// RETURN VALUE:
//
// TRUE - Success
// FALSE - Failure
//
// COMMENTS:
//
// Dialog boxes take on the screen position that they were designed
// at, which is not always appropriate. Centering the dialog over a
// particular window usually results in a better position.
//
BOOL CenterWindow(HWND hwndChild, HWND hwndParent)
{
RECT rcChild, rcParent;
int cxChild, cyChild, cxParent, cyParent;
int cxScreen, cyScreen, xNew, yNew;
HDC hdc;
// Get the Height and Width of the child window
GetWindowRect(hwndChild, &rcChild);
cxChild = rcChild.right - rcChild.left;
cyChild = rcChild.bottom - rcChild.top;
// Get the Height and Width of the parent window
GetWindowRect(hwndParent, &rcParent);
cxParent = rcParent.right - rcParent.left;
cyParent = rcParent.bottom - rcParent.top;
// Get the display limits
hdc = GetDC(hwndChild);
cxScreen = GetDeviceCaps(hdc, HORZRES);
cyScreen = GetDeviceCaps(hdc, VERTRES);
ReleaseDC(hwndChild, hdc);
// Calculate new X position, then adjust for screen
xNew = rcParent.left + ((cxParent - cxChild) / 2);
if (xNew < 0)
{
xNew = 0;
}
else if ((xNew + cxChild) > cxScreen)
{
xNew = cxScreen - cxChild;
}
// Calculate new Y position, then adjust for screen
yNew = rcParent.top + ((cyParent - cyChild) / 2);
if (yNew < 0)
{
yNew = 0;
}
else if ((yNew + cyChild) > cyScreen)
{
yNew = cyScreen - cyChild;
}
// Set it, and return
return SetWindowPos(hwndChild,
NULL,
xNew, yNew,
0, 0,
SWP_NOSIZE | SWP_NOZORDER);
}
//
// FUNCTION: SetWindowTitle(HWND, LPSTR)
//
// PURPOSE: Sets the title of the application window
//
// PARAMETERS:
// hwnd - The window handle.
// lpszFileName - Pointer to file name string.
//
// RETURN VALUE:
// none.
//
// COMMENTS:
//
//
void SetWindowTitle(HWND hwnd, LPSTR lpszFileName)
{
int nChars;
char szTitle[MAX_PATH];
LPBITMAPINFOHEADER lpbih;
if (hDIBInfo)
lpbih = (LPBITMAPINFOHEADER)GlobalLock(hDIBInfo);
nChars = lstrlen(lpszFileName);
if (nChars && lpbih)
{
char szChanges[2] = { 0, 0 };
if (fChanges)
szChanges[0] = '*';
// a DIB Section exists
wsprintf(szTitle,
"%s - %s (%ld x %ld x %d BPP)%s",
szAppName,
lpszFileName,
lpbih->biWidth,
lpbih->biHeight,
lpbih->biBitCount,
szChanges);
// save current file name
lstrcpy((LPSTR)szCurrentFile, lpszFileName);
GlobalUnlock(hDIBInfo);
}
else
// no DIB Section so just show application description text
wsprintf(szTitle, "%s", SZDESCRIPTION);
SetWindowText(hwnd, szTitle);
}
//
// FUNCTION: InitDIBSection(HWND)
//
// PURPOSE: Initialize the bitmap surface and paint the display.
//
// PARAMETERS:
// hwnd - The window displaying the bitmap.
//
// RETURN VALUE:
// none.
//
// COMMENTS:
//
//
void InitDIBSection(HWND hwnd)
{
HDC hdc, hdcMem;
HBITMAP hbmOld;
HPALETTE hpalOld = NULL;
HPALETTE hpalOldMem = NULL;
LPBITMAPINFOHEADER lpbih;
if (!hwnd || !hDIBInfo || !hBitmap)
return;
lpbih = (LPBITMAPINFOHEADER)GlobalLock(hDIBInfo);
if (!lpbih)
return;
hdc = GetDC(hwnd);
hdcMem = CreateCompatibleDC(hdc);
hbmOld = SelectObject(hdcMem, hBitmap);
if (hPalette)
{
hpalOld = SelectPalette(hdc, hPalette, FALSE);
RealizePalette(hdc);
hpalOldMem = SelectPalette(hdcMem, hPalette, FALSE);
}
PatBlt(hdcMem, 0, 0, lpbih->biWidth, lpbih->biHeight, WHITENESS);
PatBlt(hdc, 0, 0, lpbih->biWidth, lpbih->biHeight, WHITENESS);
if (hpalOldMem)
SelectPalette(hdcMem, hpalOldMem, FALSE);
if (hpalOld)
SelectPalette(hdc, hpalOld, FALSE);
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
ReleaseDC(hwnd, hdc);
GlobalUnlock(hDIBInfo);
}
//
// FUNCTION: RemoveDIBSection()
//
// PURPOSE: Removes the current DIB section and resets global variables
//
// PARAMETERS:
// none.
//
// RETURN VALUE:
// none.
//
// COMMENTS:
//
//
void RemoveDIBSection()
{
if (hDIBInfo)
{
// free old DIB header
GlobalFree(hDIBInfo);
hDIBInfo = NULL;
}
if (hBitmap)
{
// remove existing DIB section
DeleteObject(hBitmap);
hBitmap = NULL;
}
// bits are gone
lpvBits = NULL;
if (hPalette)
{
// remove existing palette object
DeleteObject(hPalette);
hPalette = NULL;
}
// reset the drawing objects to defaults
InitDrawObjects();
// if there were edits, they are gone
fChanges = FALSE;
// update status of menu and toolbar
EnableMenuItem(hMenu, IDM_FILESAVE, MF_DISABLED);
SendMessage(hWndToolbar, TB_ENABLEBUTTON, IDM_FILESAVE, MAKELONG(FALSE, 0));
EnableMenuItem(hMenu, IDM_FILESAVEAS, MF_DISABLED);
EnableMenuItem(hMenu, IDM_FILECLOSE, MF_DISABLED);
EnableMenuItem(hMenu, IDM_CLEAR, MF_DISABLED);
}